package br.uff.probabilidade.modelo.configuracao;

import java.util.Vector;

import br.uff.probabilidade.modelo.configuracao.exception.LayoutInvalido;

public class Layout {
	private String campo;
	private String[] parametros;
	private int point = 0;	
	private char separador = ' ';
	
	public Layout(char separador){
		this.separador = separador;
	}
	
	public Layout(String campo, int numParametros){
		this.campo = campo;
		parametros = new String[numParametros];		
	}
	
	public int addParametro(String parametro){
		this.parametros[point] = parametro;
		point++;
		return point -1;
	}
	
	public void extrairValores(String linha) throws LayoutInvalido{
		if(this.campo ==null || this.parametros == null)
			processaLinhaNova(linha);
		else
			processaLinha(linha);
	}
	
	private void processaLinha(String linha) throws LayoutInvalido{
		linha = linha.trim();
		int indexCampo = linha.indexOf(campo); 
		if(indexCampo!=0) throw new LayoutInvalido("Posicao do campo '"+this.campo+"' não esta correta.",linha);
		
		if(linha.charAt(indexCampo+1)!=':') throw new LayoutInvalido("Esperado : logo após '"+this.campo+"'.",linha);
		
		if(linha.split(" ").length-1 != this.parametros.length) throw new LayoutInvalido("Número inválido de parametros.",linha);
		String[] parametros = linha.split(" "); 
		for(int i=1;i<parametros.length;i++){
			this.addParametro(parametros[i]);
		}
	}	
	
	private void processaLinhaNova(String linha) throws LayoutInvalido{
		linha = linha.trim();									
		if(linha.length()<0)throw new LayoutInvalido("Linha Vazia.",linha);
		if(linha.indexOf(':')<0)throw new LayoutInvalido(" : não foi encontrado.",linha);
		if(linha.indexOf(':')==0)throw new LayoutInvalido("Não foi encontrado o nome do campo.",linha);
		if(linha.indexOf(':')+1>=linha.length())throw new LayoutInvalido("Não foi encontrado atribuicao para o campo.",linha);
		
		
		//String[] parametros = linha.substring(linha.indexOf(':')+1, linha.length()).split(String.valueOf(separador));
		
		String[] parametros  = this.segmentarParametros(linha.substring(linha.indexOf(':')+1, linha.length()));
		
		this.campo = linha.substring(0, linha.indexOf(':'));
		
		this.parametros = new String[parametros.length];
				
		//System.out.println(this.campo);
		for(int i=0;i<parametros.length;i++){
			//System.out.println("\t"+parametros[i]);
			this.addParametro(parametros[i]);
		}
	}
	
	private String[] segmentarParametros(String params){
		//System.out.println(params);
		boolean startString = false;
		Vector parametros = new Vector();
		
		String param = "";
		for(int i=0;i<params.length();i++){
			if(params.substring(i, i+1).equals("'"))
				startString = !startString;
			else if(!startString && params.substring(i, i+1).equals(String.valueOf(this.separador))){
					if(!param.trim().equals(""))parametros.add(param);
					param="";
			}else{				
				param+=params.substring(i, i+1);
			}
		}
		if(!param.trim().equals(""))parametros.add(param);
		String[] retorno = new String[parametros.size()];
		for(int i=0;i<retorno.length;i++){
			retorno[i] = (String)parametros.get(i);
		}
		return retorno;
	}
	

	public String getCampo() {
		return campo;
	}

	public String[] getParametros() {
		return parametros;
	}	
}
